package com.cskaoyan.javase.method._0introduction;

import java.io.PushbackInputStream;
import java.util.concurrent.locks.ReadWriteLock;

/**
 * 全新的版本 用方法来改造案例
 * 用方法来实现,求两个int类型数值之和的需求,复用代码,重复实现求和的功能
 *
 * 方法的语法:
 * [修饰符列表] 返回值类型 方法名 (形式参数列表){
 *   // 方法体
 * }
 * 在逐一解释方法的语法结构之前,先知道两个概念:
 *      1.方法头.指的是由"[修饰符列表] 返回值类型 方法名 (形式参数列表)"组成的结构
 *          也叫方法的声明
 *      2.方法的签名.就用来代表一个方法,指的是由"方法名 (形式参数列表)"组成的结构
 * 逐一解释语法:
 *      1.[修饰符列表] 指的是由方法的修饰符组成的列表.
 *          方法可以使用的修饰符很多,但是这里默认它是public static,和main方法的修饰符列表保持一致
 *          而且要注意,修饰符列表不是必须的,方法可以没有任何修饰符.
 *
 *      2.返回值类型,返回值的数据类型就是返回值类型
 *          返回值: 指的是方法实现功能后,给出的结果值,称之为返回值
 *          如果一个方法有返回值,那么返回值类型可以是基本数据类型,也可以是引用数据类型
 *
 *      3.方法名.方法名是一个标识符,遵循小驼峰式的命名规范
 *          尽量使用合法的英文单词,尽量"见名知意",通过名字就能够描述一个方法的作用
 *          而且由于方法多用来描述操作,方法名多数使用动词
 *          比如求最大值的方法,应该叫"getMaxValue"
 *          比如求和的方法,应该叫"sum"
 *          一个方法的方法名是很重要的,要起好名字,对自己对大家都有好处
 *
 *      4.形式参数列表,由形式参数组成的列表,可以有一个,两个,多个,也可以没有.没有形参的方法,称之为无参方法
 *         形式参数,简称形参
 *         方法在实现功能时,有时需要传入数据作为方法实现功能的参数
 *         但是一个方法,怎么告诉外界调用时,需要传入的参数的个数和数据类型呢?
 *         就是通过形式参数,形参
 *         所以形参的定义语法是:
 *              数据类型 变量名;
 *         其中,数据类型是告诉方法的调用者,需要传入数据的数据类型,变量名是为了传入的数据能够在方法中使用
 *         多个形参之间用","逗号隔开
 *
 *         思考:
 *              形式参数是不是一个真的参数,真的数据?
 *         不是,形式参数只是一个占位符,目的是告诉方法的调用者传入参数的个数和数据类型,它不是真正的数据
 *
 *         在方法调用时,那些需要真正传入方法的参数数据,称之为"实际参数",简称实参,它们才是一个真正的参数,真正的数据.
 *
 *      5.方法体,是方法实现功能需要执行的一段代码合集,方法体可以很长,也可以什么都没有.
 *
 * 以上就是方法的语法
 * 接下来开始定义方法:
 *
 * 1.方法定义的位置:
 *      类体当中,其它方法的外部,方法不能嵌套定义.
 *
 * 2.在定义一个方法时,如果通过返回值类型确定规定了这个方法具有返回值,那么就必须在方法体中使用"return + 值"来明确它的返回值.
 *      或者使用"return + 表达式"
 *      只要return后面跟的是一个结果就行
 *
 * 3.方法定义完毕后,如何调用方法呢?
 * 在同一个类中,在main方法中,去调用同类下的static修饰的方法,可以直接用"方法名(实参列表)"直接去调用这个方法.
 *
 * 4.如果一个方法有返回值,那么建议接收或者操作它的返回值
 * 尽量不要,不管这个返回值
 * 而且操作一个具有返回值的方法调用
 * 本质就是操作这个方法的返回值
 *
 * 5.形参和方法内部定义的变量都是属于这个方法中的局部变量
 * 实参往往是方法调用处,属于方法调用处那个作用域的一个局部变量.
 *
 * 额外补充:
 *      1.方法定义的位置和方法的调用结果没有任何关系
 *      一个类中的多个方法都是平行的关系
 *      不会直接互相影响
 *
 *      2.在同一个类中,有static修饰的方法
 *          可以互相直接用方法名调用
 *
 *      3.main方法是Java程序的入口方法
 *          任何java方法,代码
 *          想要被执行
 *          就必须直接或者间接的在main方法中被调用
 *
 * @since 16:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class NewDemo {

    public static void main(String[] args) {
        // Result of 'NewDemo.sum()' is ignored
        /*int sumValue = sum(1, 1);
        System.out.println(sum(1, 2));
        System.out.println(sum(10, 20) + 100);

        int num1 = 10;
        int num2 = 20;
        System.out.println(sum(num1, num2));*/

        System.out.println(test());
    }

    // 定义一个方法,用于求两个int数据的和,并返回结果
    public static int sum(int num1, int num2) {
        // Missing return statement
        // Local variable 'sumValue' is redundant
        // int sumValue = num1 + num2;
        return num1 + num2;
    }

    public static String test() {
        System.out.println(sum(10, 10));
        return "hello world!";
    }

    public static double test2(){
        return 0.1;
    }


}

